package cn.kgc.controller;

import cn.kgc.pojo.User_info;
import cn.kgc.pojo.vo.Result;
import cn.kgc.service.User_infoService;
import cn.kgc.util.TokenUtils;
import net.minidev.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private User_infoService userService;

    /* 获取校验码 */
    @RequestMapping("/getVerifyCode")
    public void generate(HttpServletResponse response, HttpSession session) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        String verifyCodeValue = drawImg(output);
        // 将校验码保存到session中
        session.setAttribute("verifyCodeValue", verifyCodeValue);

        try {
            ServletOutputStream out = response.getOutputStream();
            output.writeTo(out);
        } catch (IOException e) {
            System.out.println("<--验证码前端写出.出现异常-->");
            e.printStackTrace();

        }
    }

    /* 绘制验证码 */
    private String drawImg(ByteArrayOutputStream output) {
        String code = "";
        // 随机产生4个字符
        for (int i = 0; i < 4; i++) {
            code += randomChar();
        }
        int width = 70;
        int height = 25;
        BufferedImage bi = new BufferedImage(width, height,
                BufferedImage.TYPE_3BYTE_BGR);
        Font font = new Font("Times New Roman", Font.PLAIN, 20);
        // 调用Graphics2D绘画验证码
        Graphics2D g = bi.createGraphics();
        g.setFont(font);
        Color color = new Color(66, 2, 82);
        g.setColor(color);
        g.setBackground(new Color(226, 226, 240));
        g.clearRect(0, 0, width, height);
        FontRenderContext context = g.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(code, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = bounds.getY();
        double baseY = y - ascent;
        g.drawString(code, (int) x, (int) baseY);
        g.dispose();
        try {
            ImageIO.write(bi, "jpg", output);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return code;
    }

    /* 获取随机参数 */
    private char randomChar() {
        Random r = new Random();
        String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
        return s.charAt(r.nextInt(s.length()));
    }

//token工具类，生成token用的

    //登录生成token并返回给客户端
    //此方法没有@UserLoginToken注解，不会被拦截
    @PostMapping("/login")
    @ResponseBody
    public Object login(@RequestBody User_info user,HttpSession session){
        System.out.println(user);
        JSONObject jsonObject=new JSONObject();
        if(!userService.checkUserId(user.getUsername())){
            jsonObject.put("message","登录失败,用户不存在！");
            System.out.println("登录失败,用户不存在！");
            return jsonObject;
        }else  if(!userService.getPass(user.getUsername()).equals(user.getPassword()))
        {
            jsonObject.put("message","登录失败,密码错误！");
            System.out.println("登录失败,密码错误！");
            return jsonObject;
        }
        else {
            //使用用户密码签名生成token,token中存储用户id
            String token = TokenUtils.getToken(user);
            //json中返回token信息
            jsonObject.put("token", token);
            session.setAttribute("user",user);
            System.out.println("登录成功");
            return jsonObject;

        }
    }


    //退出
    @GetMapping("/logout")
    public String logout(HttpSession session){
        //清楚session
        session.removeAttribute("user");
        session.invalidate();//将缓存失效
        //记录退出日志
        return "redirect:/index";
    }
}
